﻿// -------------------------------------------------------------------------
//    @FileName         :    NFSnsFriendPart.h
//    @Author           :    gaoyi
//    @Date             :    2025-03-31
//    @Email			:    445267987@qq.com
//    @Module           :    NFSnsFriendPart
//
// -------------------------------------------------------------------------

#pragma once

#include "NFSnsDetailPart.h"
#include "proto_common_friend.nanopb.h"

class NFSnsFriendPart : public NF_OBJECT_TEMPLATE_MACRO(NFSnsFriendPart, EOT_SNS_DETAIL_PART_MIN_ID + PART_SNS_DETAIL_FRIEND, NFSnsDetailPart)
public:
    NFSnsFriendPart();

    ~NFSnsFriendPart() override;

    int CreateInit();

    int ResumeInit();

public:
    //******************part调用接口******************
    /**
     * @brief 释放part资源
     * @return
     */
    int UnInit() override;

    /**
     * @brief 所有部件初始化完成
     * @return
     */
    int OnInit() override { return 0; }

public:
    /**
     * @brief 从数据库中加载数据
     * @param pDbData
     * @return
     */
    int LoadFromDb(const proto_ff::tbSnsRoleDetail* pDbData) override;

    /**
     * @brief 存储DB部件入口
     * @param pDbData
     * @return
     */
    int SaveDb(proto_ff::tbSnsRoleDetail* pDbData) override;

    /**
     * @brief 注册后的初始化
     * @return
     */
    int OnRegister() override { return 0; }

    /**
     * @brief 登陆入口
     * @return
     */
    int OnLogin() override;

    /**
     * @brief 登出入口
     * @return
     */
    int OnLogout() override { return 0; }

    /**
     * @brief 掉线入口
     * @return
     */
    int OnDisconnect() override { return 0; }

    /**
     * @brief 重连入口
     * @return
     */
    int OnReconnect() override { return 0; }

    ////////////////////////////////// 每日零点 每周一零点 刷新接口 ///////////////////////////////////
    /**
     * @brief 每日零点 刷新接口
     * @return
     */
    int DailyZeroTick() override { return 0; }

    /**
     * @brief 每日4/6点 刷新接口
     * @return
     */
    int DailyOtherTick() override { return 0; }

    /**
     * @brief 每日零点 刷新接口
     * @return
     */
    int WeekZeroTick() override { return 0; }

    /**
     * @brief 每月刷新接口
     * @return
     */
    int MonthZeroTick() override { return 0; }

public:
    /**
     * @brief update
     */
    int Tick() override { return 0; }

public:
    int MakeDataCs(proto_ff::MyFriendInfo* pInfo);
    MyFriendInfo* GetFriendInfo() { return &m_friend; }
    const MyFriendInfo* GetFriendInfo() const { return &m_friend; }

public:
    // 检查是否是黑名单
    FriendInfo* GetBlack(uint64_t roleId);
    const FriendInfo* GetBlack(uint64_t roleId) const;
    // 检查是否是好友
    FriendInfo* GetFriend(uint64_t roleId);
    const FriendInfo* GetFriend(uint64_t roleId) const;

    IMOtherList* GetOther(uint64_t roleId);
    const IMOtherList* GetOther(uint64_t roleId) const;

    FriendDayDegree* GetFriendDayDegree(uint64_t roleId);
    const FriendDayDegree* GetFriendDayDegree(uint64_t roleId) const;

public:
    // 好友是否已满，通过所有途径加入的好友
    bool CheckFriendFull();
    // 判断好友是否已满，同步普通途径加入的好友（师徒是属于特殊，以后的其他强关系都是特殊的）
    bool CheckSimpleFriendFull();
    // 黑名单是否已满
    bool CheckBlackFull();

    // 增加好友，属于无条件加
    // 得先判断是否超出范围
    FriendInfo* AddFriend(uint64_t roleId, bool bIsSnsFriend = false);
    // 增加黑名单，属于无条件加
    // 得先判断是否超出范围
    FriendInfo* AddBlack(uint64_t roleId);

    // 别人加我为好友标识
    IMOtherList* OtherAddMeFriend(uint64_t roleId, bool isFriend = false);

    // 删除好友
    void DelFriend(uint64_t roleId);
    // 删除黑名单
    void DelBlack(uint64_t roleId);
    // 别人删除我好友
    void OtherDelMeFriend(uint64_t roleId);

public:
    // 增加当日友好度
    void AddFriendDayDegree(uint64_t roleId, int degree);
    // 删除当日友好度记录
    void DeleteFriendDayDegree(uint64_t roleId);

private:
    MyFriendInfo m_friend;
};
